/******************************************************************************/
/* Fichero: ClaseRemotaServidor.java
/* Versión: 1.0
/* Autor: Ana Belen Cambra
/* Fecha: Mayo 2009
/* Proyecto: Gestor de Cumpleaños de AelanSoft - Cliente
/* Descripción: Implementacion de la interfaz remota para RMI
/******************************************************************************/
package rmi;

import utiles.Persona;
import utiles.VectorPersonas;
import java.rmi.*;
import java.sql.*;
import java.rmi.server.*;

/******************************************************************************/
public class ClaseRemotaServidor extends UnicastRemoteObject implements
   InterfazRemotaServidor {
/******************************************************************************/

   // Atributos
   private static Connection baseDatos;

   /****************************************************************************
    * Constructor de la clase
    * @param conexion conexion a la base de datos
    * @throws java.rmi.RemoteException
    ***************************************************************************/
   public ClaseRemotaServidor(Connection conexion) throws RemoteException {
      super();
      baseDatos = conexion;
   }

   /****************************************************************************
    * Introduccion de un usuario en la base de datos
    * @param nombre nombre del usuario
    * @param apellidos apellidos del usuario
    * @param correo correo electronico del usuario
    * @param contrasena contraseña del usuario
    * @param cumpleanosDia dia de cumpleaños del usuario
    * @param cumpleanosMes mes de cumpleaños del usuario
    * @return estado codigo de estado
    * @throws java.rmi.RemoteException
    * @throws java.rmi.server.ServerNotActiveException
    ***************************************************************************/
   public Integer IntroducirUsuario(String nombre, String apellidos,
      String correo, String contrasena, Integer cumpleanosDia,
      Integer cumpleanosMes) throws RemoteException, ServerNotActiveException {
      // Variables
      PreparedStatement stmtNuevoUsuario = null;
      String consulta = "INSERT INTO Usuario" +
            " (mail, nombre, apellidos, contrasena, dia, mes)" +
            " VALUES (?,?,?,?,?,?)";
      try {
         stmtNuevoUsuario = baseDatos.prepareStatement(consulta);
         stmtNuevoUsuario.setString(1, correo);
         stmtNuevoUsuario.setString(2, nombre);
         stmtNuevoUsuario.setString(3, apellidos);
         stmtNuevoUsuario.setString(4, contrasena);
         stmtNuevoUsuario.setInt(5, cumpleanosDia);
         stmtNuevoUsuario.setInt(6, cumpleanosMes);
         try {
            stmtNuevoUsuario.executeUpdate();
            return 0;
         }
         catch (SQLException e) {
            // existe usuario
            return 4;
         }
      }
      catch (SQLException e) {
         // no se ha podido realizar la operacion
         return 5;
      }
   }

   /****************************************************************************
    * Validacion de un usuario en la base de datos
    * @param correo correo electronico del usuario
    * @param contrasena contraseña del usuario
    * @return estado codigo de estado
    * @throws RemoteException
    * @throws ServerNotActiveException
    ***************************************************************************/
   public Integer ValidarUsuario(String correo, String contrasena) throws
      RemoteException, ServerNotActiveException {
      // Variables
      PreparedStatement stmtUsuario = null;
      String consulta = "SELECT usuario.contrasena FROM usuario WHERE " +
            "mail = ?";
      ResultSet resultado;

      try {
         stmtUsuario = baseDatos.prepareStatement(consulta);
         stmtUsuario.setString(1, correo);
         try {
            resultado = stmtUsuario.executeQuery();
            resultado.next();
            if (contrasena.equals(resultado.getString(1))) {
               // son iguales
               return 0;
            } else {
               // usuario no existe o es incorrecto
               return 8;
            }
         }
         catch (SQLException e) {
            // usuario no existe o es incorrecto
            return 8;
         }
      }
      catch (SQLException e) {
         // no se ha podido realizar la operacion
         return 5;
      }
   }

   /****************************************************************************
    * Recuperacion de la lista de amigos de un usuario de la base de datos
    * @param correo correo electronico del usuario
    * @return amigos lista de amigos del usuario
    * @throws java.rmi.RemoteException
    * @throws java.rmi.server.ServerNotActiveException
    ***************************************************************************/
   public VectorPersonas ListarAmigos(String correo) throws
      RemoteException, ServerNotActiveException {
      // Variables
      PreparedStatement stmtAmigos = null;
      ResultSet lista;
      String consultaAmigos = "SELECT U.mail, U.nombre, U.apellidos, " +
            "U.dia, U.mes FROM usuario U, serAmigoDe S WHERE S.usuario1 = '" +
            correo + "' AND " + "S.usuario2 = U.mail";

      try {
         stmtAmigos = baseDatos.prepareStatement(consultaAmigos);
         lista = stmtAmigos.executeQuery();
         VectorPersonas amigos = new VectorPersonas();
         while (lista.next()) {
            Persona p = new Persona();
            p.SetCorreo(lista.getString(1));
            p.SetNombre(lista.getString(2));
            p.SetApellidos(lista.getString(3));
            p.SetDiaCumple(lista.getInt(4));
            p.SetMesCumple(lista.getInt(5));
            amigos.add(p);
         }
         return amigos;
      }
      catch (SQLException e) {
         // error en la consulta
         return null;
      }
   }

   /****************************************************************************
    * Busqueda de amigos del usuario
    * @param correo correo electronico del usuario
    * @param datos datos de busqueda
    * @return amigos lista de amigos del usuario
    * @throws java.rmi.RemoteException
    * @throws java.rmi.server.ServerNotActiveException
    ***************************************************************************/
   public VectorPersonas BuscarAmigos(String correo, String datos)
      throws RemoteException, ServerNotActiveException {
      // Variables
      PreparedStatement stmtAmigos;
      ResultSet lista;
      String consultaAmigos = "SELECT U.mail, U.nombre, U.apellidos, U.dia, " +
            "U.mes FROM usuario U " + "WHERE LOWER(U.mail) like " +
            "LOWER('%" + datos + "%') OR LOWER(U.nombre) like " +
            "LOWER('%" + datos + "%') OR LOWER(U.apellidos) like " +
            "LOWER('%" + datos + "%') MINUS " + "SELECT U.mail, U.nombre, " +
            "U.apellidos, U.dia, U.mes FROM usuario U, serAmigoDe S " +
            "WHERE S.usuario1 = '" + correo + "' AND S.usuario2 = U.mail " +
            "MINUS " + "SELECT U.mail, U.nombre, U.apellidos, U.dia, U.mes " +
            "FROM usuario U WHERE U.mail = '" + correo + "'";

      try {
         stmtAmigos = baseDatos.prepareStatement(consultaAmigos);
         lista = stmtAmigos.executeQuery();
         VectorPersonas amigos = new VectorPersonas();
         while (lista.next()) {
            Persona p = new Persona();
            p.SetCorreo(lista.getString(1));
            p.SetNombre(lista.getString(2));
            p.SetApellidos(lista.getString(3));
            p.SetDiaCumple(lista.getInt(4));
            p.SetMesCumple(lista.getInt(5));
            amigos.add(p);
         }
         return amigos;
      }
      catch (SQLException e) {
         // error en la consulta
         return null;
      }
   }

   /****************************************************************************
    * Adicion de un amigo a un usuario en la base de datos
    * @param correoU correo electronico del usuario
    * @param correoA correo electronico del nuevo amigo
    * @return estado codigo de estado
    * @throws java.rmi.RemoteException
    * @throws java.rmi.server.ServerNotActiveException
    ***************************************************************************/
   public Integer AnadirAmigo(String correoU, String correoA) throws
      RemoteException, ServerNotActiveException {
      // Variables
      PreparedStatement stmtNuevoAmigo = null;
      String consulta = "INSERT INTO SerAmigoDe" +
            " (usuario1, usuario2)" +
            " VALUES (?,?)";

      try {
         stmtNuevoAmigo = baseDatos.prepareStatement(consulta);
         stmtNuevoAmigo.setString(1, correoU);
         stmtNuevoAmigo.setString(2, correoA);
         try {
            stmtNuevoAmigo.executeUpdate();
            return 0;
         }
         catch (SQLException e) {
            // existe el amigo
            return -1;
         }
      }
      catch (SQLException e) {
         // no se ha podido realizar la operacion
         return 5;
      }
   }
}
